
'''
UTF-8编码:
    UTF-8编码的具体规则如下:
        对于单字节字符(0x00-0x7F):
    对于多字节字符：
        第一个字节的高位用于指示字符的字节数：
            2字节字符:110xxxxx
            3字节字符:1110xxxx
            4字节字符:11110xxx
            后续字节的格式为:10xxxxxx
        字符的Unicode码点被填充到x的位置。

主要要点：
    0、python中字符串类型以""或者''标识，两者之间可以相互嵌套、以此避免转义
    1、Python中的字符串有两种索引方式,从左往右以0开始,从右往左以-1开始。
    2、Python中的字符串属于不可变对象
    3、反斜杠可以用来转义,使用r可以让反斜杠不发生转义。
    4、字符串可以用'+'运算符连接在一起，用'*'运算符重复。


数字判别：
    str.isdigit()       :阿拉伯数字
    str.isdecimal()     :阿拉伯数字 + 全角数字
    str.isnumeric()     :阿拉伯数字 + 全角数字 + 中文数字 + 其它语言中的数字

'''

#字符串是不可变类型，相同内容的字符串其实是一个对象，对象的索引ID是相同的
string1 = "helloworld"
string2 = "helloworld"
print("id(string1): {}, id(string2): {}".format(id(string1), id(string2)))


#字符串赋值
def string_assign_value():
    #创建字符串
    str = "0123456789" 
    str = '0123456789' 

    str = """hello     
    world
    from"""
    str = '''hello
    world
    from'''

    #相互嵌套
    str = "i'm tom"
    str = 'i\'m tom'

    str = 'he said "this is good"'
    str = "he said \"this is good\""

    #连接符
    str = "hello" \
    "world" 


#转义、raw
def string_raw():
    print("hello\nrunoob")      #转义
    print(r"hello\nrunoob")     #raw string(去除转义)

# f-string
name = "runoob"
print(f"hello {name}")
print(f"hello {1 + 2}")

#字符串遍历
def string_loop():
    for c in "hello world":
        print("char: {}".format(c))


#字符串拼接
def string_concatenate():
    print(str + "你好")         #字符串拼接
    print(str * 2)              #用*运算符指定重复次数
    print(";".join(["ab", "cd", "ef"]))


#字符串切片、分割
def string_extract_split():
    str = "0123456789"
    #单个字符索引
    print(str[0])               #第一个字符
    print(str[-1])              #最后一个字符
    #子字符串
    print(str[0:-1])            #指定范围，前闭后开
    print(str[2:5])             #指定范围，前闭后开
    print(str[2:])              #指定开头位置，默认延伸到最后
    print(str[:8])              #指定结尾位置，默认延伸到最前
    print(str[:])               #所有字符
    print(str[1:5:2])           #指定前闭后开范围 + 步长
    print(str[::2])             #全范围内，正向前进
    print(str[-1::-2])          #全范围内：负向前进

    str = "/path/to/some/file"
    print(str.split("/"))       #从左往右开始切分
    print(str.rsplit("/", maxsplit=1)[0])      #从右往左开始切分
    print(str.splitlines())     #切分为行


"""
查找、计数、替换
    查找：返回找到的第一个匹配项的下标，如果没有找到则返回-1
    计数：返回找到的匹配项的个数
    替换:用新的substring替换旧的substring
"""
def string_search_replace():
    line = "hello world nihao"
    line.find("hello")
    line.rfind("hello")

    if 'hello' in line:
        print("in")
    elif "hello" not in line:
        print("not in")

    line.count("hello")

    line.replace("he", "ll")



"""
常用方法
"""
def string_common():
    mystr = "hello world world hello"
    #字符串首字母大写
    print(mystr.capitalize())
    #字符串每个单词首字母大写
    print(mystr.title())

    #转换为大写
    print(mystr.upper())
    #转换为小写
    print(mystr.lower())

    mystr = "   hello   "
    #删除左侧空白字符
    print(mystr.lstrip())
    #删除右侧空白字符
    print(mystr.rstrip())
    #删除所有空白字符
    print(mystr.strip())


"""
 模式匹配：
"""
mystr = "hello world python"
print(mystr.startswith("hello"))
print(mystr.endswith("python"))

print(mystr.isalpha())
print(mystr.isnumeric())
print(mystr.isalnum())
print(mystr.isspace())



"""
    将输出值转换为字符串
        str():  函数返回一个用户易读的表达形式
        repr(): 产生一个解释器易读的表达形式
"""
def repr_test():
    x = 0.12
    y = 3.45
    s = "x的值为: " + repr(x) + ", y的值为: " + repr(y) + "..."
    print(s)

    #repr()可以保留字符串中的转义字符
    s = "hello\nworld"
    print(s)
    print(repr(s))

    #repr()的参数可以是python的任何对象
    s = (1, 2, ("hello", "world"))
    print(repr(s))


"""
    字符串对象的对齐方法：这些方法并不会写任何东西，它们仅仅返回新的字符串
        rjust()
        ljust()
        center()
"""
def rightLeftCenter_test():
    #右对齐
    print("12345".rjust(10), "12345".rjust(10), "12345".rjust(10))
    print("12345678".rjust(10), "12345678".rjust(10), "12345678".rjust(10))

    #左对齐
    print("12345".ljust(10), "12345".ljust(10), "12345".ljust(10))
    print("12345678".ljust(10), "12345678".ljust(10), "12345678".ljust(10))

    #中间对齐
    print("12345".center(10), "12345".center(10), "12345".center(10))
    print("12345678".center(10), "12345678".center(10), "12345678".center(10))


"""
    str.format():
        括号及其里面的字符(称作格式化字段)将会被format()中的参数替换
        在括号中的数字用于指示传入对象在format()中的位置
        位置和关键字参数可以任意组合, 但是位置参数不能出现在关键字参数之后
"""
def str_format():
    print('{}网址： "{}!"'.format("菜鸟教程", "www.runoob.com"))
    print("常量PI的近似值为: {0:.3f}".format(math.pi))
    print("{0:10} ===> {1:10d}".format("google", 1))

    print("{0}, {1}".format("google", "runoob"))
    print("{1}, {0}".format("google", "runoob"))
    print("{1}, {0}, {name}".format("google", "alibaba", name = "runoob")) 

    # 索引键值
    table = {"goole":1, "runoob":2, "taobao":3}
    print("runoob: {0[runoob]}; goole: {0[goole]}; taobao: {0[taobao]}".format(table))
